package com.essence.grabiec104.grab.router;

import java.io.*;
import java.util.Base64;

/**
 * @brief 序列化/反序列化工具类
 * @details 目前只支持在Java系统中使用，对象只有继承了Serializable接口的对象才可以序列化
 */
public class SerializationUtils {
    /**
     * @brief 将对象序列化对象为 Base64 字符串
     */
    public static String serializeToString(Serializable obj) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
            oos.writeObject(obj);
        }
        byte[] bytes = baos.toByteArray();
        return Base64.getEncoder().encodeToString(bytes); // 转换为 Base64 字符串
    }

    /**
     * @brief 将 Base64 字符串反序列化为对象
     */
    public static <T> T deserializeFromString(String base64Str, Class<T> expectedType)
            throws IOException, ClassNotFoundException {
        byte[] bytes = Base64.getDecoder().decode(base64Str);
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        try (ObjectInputStream ois = new ObjectInputStream(bais)) {
            Object obj = ois.readObject();
            if (expectedType.isInstance(obj)) {  // 类型检查
                return expectedType.cast(obj);   // 安全转型
            } else {
                throw new IllegalArgumentException("反序列化类型不匹配，预期: " +
                        expectedType.getName() + "，实际: " + obj.getClass().getName());
            }
        }
    }
}
